/*
 * 如果一个构造函数的第一个参数是自身类类型的引用, 且任何额外参数都有默认值,则此构造函数是拷贝构造函数
*/ 

#include <utility>
#include <iostream>

class Foo {
public:
	Foo() = default;  // 默认构造函数
	Foo(const Foo&);  // 拷贝构造函数, 拷贝函数的第一个参数必须是一个引用类型
	// other members, but Foo does not define a move constructor
};

Foo::Foo(const Foo&) { std::cout << "Foo copy ctor" << std::endl; }

int main()
{
	Foo x;
	Foo y(x);            // copy constructor; x is an lvalue
	Foo z(std::move(x)); // copy constructor, because there is no move constructor
}
